package libra.controller;

import java.util.HashMap;
import java.util.Map;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.cloud.openfeign.SpringQueryMap;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;

import libra.model.JsonResult;

/**
 * 使用@FeignClient注解标识OpenFeign定义的服务调用接口类，且该组件必须存在于容器内
 * 基于Feign的客户端负载均衡技术
 * 接口式、注解式编程
 * @FeignClient()：使用Feign负载均衡
 * name/value：指定被调用的微服务，填写spring.application.name微服务名，调用服务名，使用注册服务名即可不关心ip、port
 * path: 定义当前FeignClient的统一前缀，当我们项目中配置了server.context-path,server.servlet-path时使用
 * configuration: Feign配置类，可以自定义Feign的Encoder、Decoder、LogLevel、Contract，一般在对单个服务提供方进行定制配置时使用
 *** @FeignClient只关心服务名，即ip、port；如果有项目名的话，需要在对应接口请求地址中进行补全 ***
 *** fallbackFactory属性用来处理通用的“服务降级”，OpenFeign自身无法独立完成该功能点，需要配合Hystrix处理 ***
 */
@Component
@FeignClient( name = "Client-Provider-Payment",path = "client_provider_payment",
	//configuration = FeignConfig.class,
	fallbackFactory=FeignInterFallbackFactory.class)
public interface OpenFeignService {
	@PostMapping("/provider/save")
	public Object create( @RequestParam("serial") String serial );
	@PostMapping("/provider/queryOne")
	public Object find( @RequestParam("id") Integer id );
	@PostMapping("/provider/queryList")
	public Object list( );
	
	@PostMapping("/feignParam/feignTimeOut")
	public Object feignTimeOut();
	
	// 以下接口用于测试OpenFeign的传参
	/**
	 * 测试Get请求发送基本类型参数
	 */
	@GetMapping("/feignParam/getParam")
	public Object getParam( @RequestParam("getParam")Object getParam );
	/**
	 * 测试Post请求发送基本类型参数
	 */
	@PostMapping("/feignParam/postParam")
	public Object postParam( @RequestParam("postParam")Object postParam );
	
	/**
	 * 测试restful-get请求发送基本类型参数
	 */
	@GetMapping("/feignParam/getPath/{getPathParam}")
	public Object getPath( @RequestParam(value="getPathParam")Object para );
	/**
	 * 测试restful-post请求发送基本类型参数
	 */
	@PostMapping("/feignParam/postPath/{postPathParam}")
	public Object postPath( @PathVariable(value="postPathParam")Object para );
	
	/**
	 * 测试post请求发送json
	 */
	@PostMapping("feignParam/postJson")
	public Object postJson( @RequestBody Map<String, Object> json );
	/**
	 * 测试post请求发送Obj【Form表单】
	 */
	@PostMapping("feignParam/postObj")
	public Object postObj( @SpringQueryMap Object obj );
}
